fn main() {
let vec0 = Vec::new();
let mut vec1 = fill_vec(vec0);
println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
vec1.push(88);
println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
}
fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
let mut vec = vec;
vec.push(22);
vec.push(44);
vec.push(66);
vec
}
fill_vec
내부에서 shadowing을 이용해 새로운 변수를 반환했지만 vec1
을 mut
선언 하지않으면 에러가 난다. let s1 = String::from("hello");
let s2 = s1;
let s2 = s1;
에서는 s1의 Stack의 정보들이 복사되어 binding된다.s1
과 s2
가 scope에서 나갈 때 drop
이 동시에 발생하면 같이 참조하는 메모리를 서로 지우려할 것이다. 이 현상을 double free 에러 라고 한다. let s2 = s1
에서는 Ownership의 이동이 발생한다. s1는 더이상 사용할 수 없다.만약 정말 같은 값을 가졌지만 다른 Ownership을 가진 변수를 복제하고 싶은 경우에는 x.clone()
을 이용한다.
fn main() {
let s1 = String::from("hello");
let s2 = s1.clone();
println!("s1 = {}, s2 = {}", s1, s2);
}
마지막으로, 다음의 경우는 왜 move
가 발생하지 않을까?
fn main() {
let x = 5;
let y = x;
println!("x = {}, y = {}", x, y);
}
Copy
라는 플래그를 부여할 수 있는데, 이게 존재하는 type에 한해 move
대신 복사가 일어나고, 이전에 선언했던 변수를 그대로 사용 가능하다.아래 처럼 인자로 받을 때도 선언하는 것과 같아서 mut
을 붙일 수 있음
fn fill_vec(mut vec: Vec<i32>) -> Vec<i32> {
vec.push(22);
vec.push(44);
vec.push(66);
vec
}
move
, copy
가 발생한다.move
가 발생한다.